#pragma once

#include <iostream>
#include <semaphore.h>

namespace SemModule
{
    class Sem
    {
    public:
        Sem(int value = 1) : _init_val(value)
        {
            int n = ::sem_init(&_sem, 0, _init_val);
            if (n<0)
            {
                std::cerr << "sem fail" << std::endl;
            }
        }
        void P() //申请空间（信号量-1，小于0时阻塞）
        {
            int n = ::sem_wait(&_sem);
            (void)n;
        }
        void V() //信号量+1
        {
            int n = ::sem_post(&_sem);
            (void)n;
        }
        ~Sem()
        {
            int n = ::sem_destroy(&_sem);
            if (n<0)
            {
                std::cerr << "sem fail" << std::endl;
            }
        }

    private:
        sem_t _sem;
        int _init_val;
    };
}